package com.jeesite.modules.conf;

import java.util.concurrent.ThreadPoolExecutor;

import javax.jms.Queue;

import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;

@Configuration
public class BeanConfig {
         @Bean
         public Queue queue(){
        	 System.out.println("创建队列：systemMessage");
        	 return new ActiveMQQueue("systemMessage");
         }
         @Bean
         public Queue uploadQueue(){
        	 System.out.println("创建队列：uploadQueue");
        	 return new ActiveMQQueue("uploadQueue");
         }
         /**
          * 配置线程池
          */
         @Bean
         public ThreadPoolTaskExecutor defaultThreadPool() {
        	 ThreadPoolTaskExecutor executor=new ThreadPoolTaskExecutor();
        	 //核心线程数
        	 executor.setCorePoolSize(30);
        	 //指定最大的线程数
        	 executor.setMaxPoolSize(100);
        	 //队列中最大的数量
        	 executor.setQueueCapacity(50);
        	 //线程名称前缀
        	 executor.setThreadNamePrefix("zpp-jeesite-boot");
        	 //线程策略
        	 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        	 //线程空闲后的最大存活时间
        	 executor.setKeepAliveSeconds(60);
        	 //加载
        	 executor.initialize();
        	 return executor;
         }
             @Bean
             @SuppressWarnings("all")
             public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
                 RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
                 template.setConnectionFactory(factory);
                 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
                 ObjectMapper om = new ObjectMapper();
                 om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
                 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
                 jackson2JsonRedisSerializer.setObjectMapper(om);
                 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
                 // key采用String的序列化方式
                 template.setKeySerializer(stringRedisSerializer);
                 // hash的key也采用String的序列化方式
                 template.setHashKeySerializer(stringRedisSerializer);
                 // value序列化方式采用jackson
                 template.setValueSerializer(jackson2JsonRedisSerializer);
                 // hash的value序列化方式采用jackson
                 template.setHashValueSerializer(jackson2JsonRedisSerializer);
                 template.afterPropertiesSet();
                 return template;
             }
}
